/* Copyright (c) 2019 Data.Co.Ltd. All rights reserved. */
package info.peigen.hotpot.component.open.api.core.service.base;

import cn.hutool.core.util.ObjectUtil;
import info.peigen.hotpot.common.core.result.ResultBase;
import info.peigen.hotpot.component.open.api.facade.OpenApiServiceContext;
import jakarta.validation.ConstraintViolationException;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * <b>(OpenApiServiceInvoke)</b>
 * 服务层接口,待具体的服务去实现
 *
 * @author Peigen
 * @version 1.0.0
 * @since 2019/05/19
 */
public interface OpenApiServiceInvoke {

    /**
     * 大多数的入参都可以在api层拦截，但是需要根据条件组合的入参校验目前不支持<br/>
     * 先用这样的方法顶一顶
     *
     * @param serviceContext 服务上下文
     */
    default void checkOrder(OpenApiServiceContext serviceContext) {
        serviceContext.getOrder().check();
    }

    /**
     * 构建Mock
     *
     * @param serviceContext 服务上下文
     */
    default void mock(OpenApiServiceContext serviceContext) {
    }

    /**
     * 业务执行代码
     *
     * @param serviceContext 服务上下文
     */
    default void invoke(OpenApiServiceContext serviceContext) {
    }

    /**
     * 根据不同的情况下，对于异常的处理<br/>
     *
     * @param e              异常
     * @param serviceContext 服务上下文
     */
    default void handleException(Exception e, OpenApiServiceContext serviceContext) {
        // 初始化一个空的Result
        if (ObjectUtil.isNull(serviceContext.getResult())) {
            serviceContext.setResult(new ResultBase());
        }

        // 异常处理不规范的时候，打印堆栈，后续优化
        e.printStackTrace();

        // 重复异常封装
        if (e instanceof SQLIntegrityConstraintViolationException) {
            serviceContext.getResult().setFailForRequestNoNotUniqueError();
            return;
        }

        // 参数异常封装
        if (e instanceof ConstraintViolationException || e instanceof IllegalArgumentException) {
            serviceContext.getResult().setFailForParaError(e.getMessage());
            return;
        }

        serviceContext.getResult().setFail(e.getMessage());
    }
}